package com.cmii.sjw.department.control.request;

import cn.hutool.http.*;
import com.cmii.sjw.department.control.request.bean.DataRequest;
import com.rw.tool.util.json.JsonUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 注意该项目使用的依赖，尤其是water-tool
 * 它是一个本地jar包，如果需要，可以在lib目录下自取（MulanPSL2）
 * <p>
 * 所有依赖:
 * <p>
 * hutool:发送请求使用的工具包
 * water-tool:缓存token使用的工具包，它的jar包在lib目录下
 * log4j & slf4j:打印日志
 * jackson:解析，构造json字符串
 * lombok:简化代码
 */
@Slf4j
public class IRSTest {
    // 应用的AK
    public static final String ACCESS_KEY = "BCDSGA_7afd0459a0488852e21e4af88af9c9dd";
    // 应用授权的接口对应的SK
    public static final String SECRET_KEY = "BCDSGS_3d7ddf6be81f124f0dcdd7dedc77be2e";

    /**
     * 请求示例，
     * 在使用前，请先阅读 readme.md
     * 此代码仅仅只是示例，请根据情况调整
     */
    public static void main(String[] args) {
        // 请求的url
        String url = "https://drs.dsjfzj.cq.cegn:11007/restapi/prod/IC50000020250721000028/xdata/tbl/api/execute/0f4aa2c2-9560-46a8-9afc-4ee6a49e83e9";


        Map<String, String> bodyMap = new HashMap<>();
        bodyMap.put("", "");
        DataRequest dataRequest = new DataRequest(bodyMap);

        // 转化为Json字符串
        String body = JsonUtil.toJson(dataRequest);

        // 发送POST请求
        System.out.println(sendPostRequest(url, body));
    }

    /**
     * 发送GET请求
     *
     * @param url   url
     * @param query 请求的query参数
     * @return 请求结果
     * @throws HttpException 请求的httpStatus不为200时会打印日志，抛出异常
     */
    public static String sendGetRequest(String url, Map<String, Object> query) {
        // 获取token
        String token = IRSUtil.getToken(ACCESS_KEY, SECRET_KEY);

        // 使用url构造请求
        HttpRequest request = HttpRequest.of(url);

        // 指定GET请求
        request.method(Method.GET);
        // 把获取的Token放入请求头中，以获得授权
        request.header(IRSUtil.TOKEN_HEADER, token);

        // 放入query参数
        request.form(query);

        // 调用该接口
        HttpResponse response = request.execute();
        // 如果http状态不为200，则报错，输出日志
        if (response.getStatus() != HttpStatus.HTTP_OK) {
            String errorMessage = "http response status error!" +
                    "method:GET, url:{}, status:{}, accessKey:{}, secretKey:{}, " +
                    "token:{}, query:{}, responseBody:{}";
            log.error(errorMessage, url, response.getStatus(), ACCESS_KEY, SECRET_KEY,
                    token, JsonUtil.toJson(query), response.body());

            String exceptionMessage = "请求接口状态码错误！请联系技术人员，详情请查看日志";
            throw new HttpException(exceptionMessage);
        }

        // 返回请求结果
        return response.body();
    }

    /**
     * 发送POST请求
     * 这里发送的请求参数默认设置的是JSON格式的
     * 有一些接口的参数是XML格式的，
     * 有一些接口还带一些query参数，
     * 请注意区别调整，修改代码
     *
     * @param url  url
     * @param body 请求的body参数
     * @return 请求结果
     * @throws HttpException 请求的httpStatus不为200时会打印日志，抛出异常
     */
    private static String sendPostRequest(String url, String body) {
        // 获取token
        String token = IRSUtil.getToken(ACCESS_KEY, SECRET_KEY);

        // 使用url构造请求
        HttpRequest request = HttpRequest.of(url);

        // 指定GET请求
        request.method(Method.POST);
        // 把获取的Token放入请求头中，以获得授权
        request.header(IRSUtil.TOKEN_HEADER, token);

        // 放入query参数
        request.body(body);
        // 设置请求格式，这里默认为json
        request.contentType(ContentType.JSON.getValue());

        // 调用该接口
        HttpResponse response = request.execute();
        // 如果http状态不为200，则报错，输出日志
        if (response.getStatus() != HttpStatus.HTTP_OK) {
            String errorMessage = "http response status error!" +
                    "method:POST, url:{}, status:{}, accessKey:{}, secretKey:{}, " +
                    "token:{}, requestBody:{}, responseBody:{}";
            log.error(errorMessage, url, response.getStatus(), ACCESS_KEY, SECRET_KEY,
                    token, body, response.body());

            String exceptionMessage = "请求接口状态码错误！请联系技术人员，详情请查看日志";
            throw new HttpException(exceptionMessage);
        }

        // 返回请求结果
        return response.body();
    }

    public static String doPost(String url, Map<String, String> bodyMap) {
        String body = JsonUtil.toJson(new DataRequest(bodyMap));
        return sendPostRequest(url, body); // 内部调用 private 方法
    }

    public static String doTest(String url, DataRequest request) {
        String body = JsonUtil.toJson(request);
        return sendPostRequest(url, body); // 内部调用 private 方法
    }
}
